# -*- coding: utf-8 -*-
"""
命令行接口模块

此模块提供干湿急转分析工具集的命令行接口。
主要功能包括：
- 提取省份网格点
- 计算区域级干旱指数
- 计算网格点级干旱指数
"""

import sys
import os
import argparse
from pathlib import Path

from dry_wet_abrupt.config import get_config, set_config


def parse_args(args=None):
    """
    解析命令行参数
    
    参数:
        args: 命令行参数列表，默认为None（使用sys.argv）
        
    返回:
        解析后的参数对象
    """
    parser = argparse.ArgumentParser(description='干湿急转分析工具集')
    subparsers = parser.add_subparsers(dest='command', help='子命令')
    
    # 提取省份网格点子命令
    extract_parser = subparsers.add_parser('extract', help='提取省份网格点')
    extract_parser.add_argument('-p', '--provinces', type=str, nargs='+', default=None,
                              help='要提取的省份名称列表，如不指定则提取所有省份')
    extract_parser.add_argument('--era5_file', type=str, 
                              default='ERA5.P.daily.2020.nc',
                              help='ERA5数据文件名或完整路径')
    extract_parser.add_argument('--shp_file', type=str, 
                              default=get_config('province_shp_path', 'GS(2023)2767审图号/省面.shp'),
                              help='省份边界GIS文件路径')
    extract_parser.add_argument('-n', '--name_field', type=str, default='NAME',
                              help='省份名称字段')
    extract_parser.add_argument('-o', '--output_dir', type=str, 
                              default=get_config('province_grid_points_dir'),
                              help='输出目录')
    
    
    # 计算网格点级干旱指数子命令
    grid_parser = subparsers.add_parser('grid', help='计算网格点级长周期旱涝急转指数(LDFAI)')
    grid_parser.add_argument('-p', '--provinces', type=str, nargs='+', default=None,
                           help='要计算的省份名称列表，如不指定则计算所有省份')
    grid_parser.add_argument('--start_year', type=int, default=1960,
                           help='起始年份')
    grid_parser.add_argument('--end_year', type=int, default=2024,
                           help='结束年份')
    grid_parser.add_argument('--period1_months', type=int, nargs='+', default=[5, 6],
                           help='第一个时期的月份列表，默认为5 6')
    grid_parser.add_argument('--period2_months', type=int, nargs='+', default=[7, 8],
                           help='第二个时期的月份列表，默认为7 8')
    grid_parser.add_argument('-o', '--output_file', type=str, default=None,
                           help='输出文件路径，默认为自动生成')
    grid_parser.add_argument('--no_cache', action='store_true',
                           help='不使用缓存')
    
    # 配置子命令
    config_parser = subparsers.add_parser('config', help='配置管理')
    config_parser.add_argument('--set', nargs=2, metavar=('KEY', 'VALUE'),
                             help='设置配置项')
    config_parser.add_argument('--get', type=str, metavar='KEY',
                             help='获取配置项')
    config_parser.add_argument('--era5-path', type=str, metavar='PATH',
                             help='设置ERA5数据目录路径')
    config_parser.add_argument('--shp-path', type=str, metavar='PATH',
                             help='设置省份边界GIS文件路径')
    
    return parser.parse_args(args)


def extract_command(args):
    """
    执行提取省份网格点命令
    
    参数:
        args: 解析后的命令行参数
    """
    from dry_wet_abrupt.grid_points.extractor import ProvinceGridPointExtractor
    import os
    
    # 处理shp_file路径
    # 优先使用命令行参数，否则使用配置
    shp_path = args.shp_file if args.shp_file != get_config('province_shp_path') else get_config('province_shp_path')
    
    # 处理era5_file路径
    # 如果用户指定了文件名（不是完整路径），则与配置目录结合
    if args.era5_file == 'ERA5.P.daily.2020.nc' or (not os.path.isabs(args.era5_file) and args.era5_file.endswith('.nc')):
        # 使用配置中的目录与文件名结合
        era5_dir = get_config('era5_data_path')
        era5_path = os.path.join(era5_dir, args.era5_file)
    else:
        # 用户指定了完整路径，直接使用
        era5_path = args.era5_file
    
    print(f"使用省份边界文件: {shp_path}")
    print(f"使用ERA5数据文件: {era5_path}")
    
    extractor = ProvinceGridPointExtractor(
        shp_path=shp_path,
        era5_path=era5_path,
        name_field=args.name_field,
        output_dir=args.output_dir
    )
    extractor.extract_and_save(args.provinces)


def grid_command(args):
    """
    执行计算网格点级长周期旱涝急转指数(LDFAI)命令
    
    参数:
        args: 解析后的命令行参数
    """
    from dry_wet_abrupt.drought_indices.grid import GridDroughtIndex
    
    calculator = GridDroughtIndex(
        start_year=args.start_year,
        end_year=args.end_year,
        use_cache=not args.no_cache
    )
    
    # 计算LDFAI
    result = calculator.calculate_ldfai(
        period1_months=args.period1_months,
        period2_months=args.period2_months,
        provinces=args.provinces
    )
    
    # 保存结果
    calculator.save_result(result, args.output_file, 'LDFAI')


def config_command(args):
    """
    执行配置管理命令
    
    参数:
        args: 解析后的命令行参数
    """
    if args.set:
        key, value = args.set
        set_config(key, value)
        print(f"已设置配置项 {key} = {value}")
    elif args.get:
        value = get_config(args.get)
        print(f"{args.get} = {value}")
    elif args.era5_path:
        set_config('era5_data_path', args.era5_path)
        print(f"已设置ERA5数据目录路径: {args.era5_path}")
        # 检查路径是否存在
        if not os.path.exists(args.era5_path):
            print(f"警告: 指定的ERA5数据目录不存在: {args.era5_path}")
            print(f"请确保该目录包含ERA5.P.daily.YYYY.nc格式的文件")
    elif args.shp_path:
        set_config('province_shp_path', args.shp_path)
        print(f"已设置省份边界GIS文件路径: {args.shp_path}")
        # 检查路径是否存在
        if not os.path.exists(args.shp_path):
            print(f"警告: 指定的省份边界GIS文件不存在: {args.shp_path}")
            print(f"请确保该文件是有效的Shapefile格式文件")


def main(args=None):
    """
    主函数
    
    参数:
        args: 命令行参数列表，默认为None（使用sys.argv）
    """
    args = parse_args(args)
    
    if args.command == 'extract':
        extract_command(args)
    elif args.command == 'grid':
        grid_command(args)
    elif args.command == 'config':
        config_command(args)
    else:
        print("请指定子命令: extract, grid, config")
        print("使用 -h 或 --help 查看帮助")
        sys.exit(1)


if __name__ == '__main__':
    main()